perm filename COLMS.SAI[PUB,TES]1 blob
sn#129296 filedate 1974-11-03 generic text, type T, neo UTF8
00100 BEGOF("COLMS")
00200 COMMENT
00300
00400 This module handles columns, groups, and margins.
00500
00600 Each area instantiation record owns a two-dimensional array of
00700 dimensions 2*columns by maxlines. AA[1:COLS,*] contain the legs of
00800 the COLS columns, and AA[COLS+1:COLS+COLS,*] contain the feet. The
00900 entry in AA is (if nonzero) an index into a MOLES array for the page
01000 (MObility of LinES), in which bits are set to indicate that certain
01100 lines must move with others in a group. Little use is made of these
01200 bits, for they were included for the unimplemented BOX FRAME feature.
01300
01400 There are also global variables GROUPM indicating that GROUP Mode is
01500 activated, and GLINEM which is the MOLES index of the first line in
01600 the current group (if it has been determined).
01700
01800 The current margin settings are in global variables LMARG and RMARG.
01900 When area-switching occurs, the current margins are stuffed into the
02000 area declaration record. When the margins of the current area are
02100 changed for the first time in a block, the old margin values are
02200 stacked on ISTK in a MARGTYPE record., thus, at END of block, the
02300 margins of all areas can be restored. Further complication is caused
02400 by NARROW-WIDEN nests, which behave like blocks but with their own
02500 save-restore code (they should never have been implemented).
02600
02700 ;
02800
02900 PROCEDURES
00100 PUBLIC INTEGER SIMPLE PROCEDURE COLSLEFT ;$"#
00200 IF COL = 0 THEN RETURN(COLS)
00300 ELSE BEGIN
00400 INTEGER COUNT, COLUMN ; COUNT ← 0 ;
00500 FOR COLUMN ← (COL - 1) MOD COLS + 1 THRU COLS DO
00600 IF AA[COLUMN, 0] = 0 AND AA[COLUMN+COLS,0] = 0 THEN COUNT ← COUNT + 1 ;
00700 RETURN(COUNT-(IF LINESLEFT<0 THEN 1 ELSE 0)) ;
00800 END "COLSLEFT" ;
00100 PUBLIC SIMPLE PROCEDURE DAPART ;$"#
00200 IF ON THEN
00300 BEGIN "DAPART"
00400 DBREAK ; GLINEM ← 0 ; COMMENT ← TES 4/25/73 ; IF GROUPM=0 THEN RETURN ;
00500 IF MOLESIDA THEN DPB(0,BELOWM(OLX)) ; GROUPM←0 ;
00600 END "DAPART" ;
00100 PUBLIC SIMPLE PROCEDURE DMARGINS(BOOLEAN INWARD) ;$"#
00200 BEGIN
00300 STRING S ; INTEGER L, R, W, ARIX, OLDIX, NEWIX ;
00400 IF ON THEN DBREAK ;
00500 ARIX ← IF AREAIXM THEN AREAIXM ELSE IXTEXT ; OLDIX ← MARGINS(ARIX) ; PASS ;
00600 S ← IF THISTYPE > INTERNTYPE OR THISTYPE=-TERQ OR NEXTSCH(←) OR NEXTSCH(:) THEN NULL
00700 ELSE E(NULL, NULL) ;
00800 IF FULSTR(S) OR ITSCH(<,>) THEN
00900 BEGIN "HAS PARAMS"
01000 L ← IF FULSTR(S) THEN CVD(S) ELSE 0 ;
01100 IF ITSCH(<,>) THEN BEGIN PASS ; R ← CVD(E("0",NULL)) END ELSE R ← 0 ;
01200 IF NOT ON THEN RETURN ;
01300 MARGINS(ARIX) ← NEWIX ← PUSHI(MARGWDS, MARGTYPE) ; W ← COLWID(ARIX) ;
01400 LMARG ← (IF OLDIX THEN LMARGX(OLDIX) ELSE 0) + INWARD*L MAX 0 MIN W-1 ;
01500 RMARG ← (IF OLDIX THEN RMARGX(OLDIX) ELSE W) - INWARD*R MIN W MAX LMARG+1 ;
01600 LMARGX(NEWIX) ← LMARG ; RMARGX(NEWIX) ← RMARG ;
01700 AREAX(NEWIX) ← ARIX ; OLD!MARGX(NEWIX) ← OLDIX ;
01800 END "HAS PARAMS"
01900 ELSE IF NOT ON THEN RETURN
02000 ELSE IF OLDIX THEN
02100 BEGIN "UNNEST"
02200 AREAX(OLDIX) ← 0 ; comment, so ENDBLOCK won't use it ;
02300 MARGINS(ARIX) ← NEWIX ← OLD!MARGX(OLDIX) ;
02400 LMARG ← IF NEWIX THEN LMARGX(NEWIX) ELSE 0 ;
02500 RMARG ← IF NEWIX THEN RMARGX(NEWIX) ELSE COLWID(ARIX) ;
02600 IF OLDIX = IHED THEN IHED ← IHED - 1 - MARGWDS ;
02700 END "UNNEST"
02800 ELSE WARN("=","Extra "&(IF INWARD>0 THEN "NARROW" ELSE "WIDEN")&" in Margin Nest") ;
02900 END "DMARGINS" ;
00100 PUBLIC RECURSIVE BOOLEAN PROCEDURE MOVEGROUP(BOOLEAN OFFPAGE ; INTEGER TOCOL, TOLINE, EXTRA) ;$"#
00200 BEGIN "MOVEGROUP"
00300 INTEGER SAVEAREA, LFOOT, PFOOT, FOOL, C, L, L1, L2, F, TC, TL, X ;
00400 IF NOT OFFPAGE THEN
00500 IF COL LEQ COLS<TOCOL OR TOCOL>2*COLS THEN BEGIN OFFPAGE←TRUE ; TOCOL ← IF COL>COLS THEN COLS+1 ELSE 1 END ;
00600 IF OFFPAGE THEN
00700 BEGIN "OTHER PAGE"
00800 SAVEAREA ← IF AREAIXM THEN LDB(BIXNUM(AREAIXM)) ELSE SYMTEXT ;
00900 GRPTOP ← OLX ; GRPOLX ← GLINEM ; GLINEM ← 0 ; CLOSEAREA(AREAIXM, FALSE) ;
01000 MOLES[0]←OLX ; OPENFRAME ; IDASSIGN(NEWPGIDA←FRAMEIDA, NEWPAGE) ;
01100 IDASSIGN(MOLESF, NMOLES) ; IDASSIGN(SHORTF, NSHORT) ;
01150 SIDASSIGN(OWLSF, NOWLS) ; IDASSIGN(MLEADF, NMLEAD) ; TES 11/2/74 MILL LEADING;
01200 NOLX ← 0 ; TES 1/15/74 0 WAS OLX ; FIXFRAME(OLDPGIDA) ;
01300 NEXTCOUNTER(SYMPAGE,IXPAGE) ;
01350 NMOLES[0]←NSHORT[0]←NMLEAD[0]←NOLX;
01400 FIXFRAME(NEWPGIDA) ; IDASSIGN(OLDPGIDA←NEWPGIDA, OLDPAGE) ;
01500 F ← ARF ;
01600 WHILE F DO
01700 BEGIN
01800 IDASSIGN(AREAIDA←F, THISAREA) ; F ← ARA ;
01900 IF (X ← DEFA) THEN
02000 BEGIN OLD!ACTIVE(X)←NEW!ACTIVE(X); NEW!ACTIVE(X)←0 END ;
02100 END ;
02200 NEWPGIDA ← 0 ; OPENAREA(LDB(IXN(SAVEAREA))) ;
02300 IF FINDTRAN(SYMPAGE,4) THEN RESPOND(LLTHIS) ;
02400 IF TOCOL > COLS THEN BEGIN COL SWAP PAL ; LINE SWAP PINE END ;
02500 END "OTHER PAGE"
02600 ELSE BEGIN "SAME PAGE"
02700 GRPOLX ← GLINEM ; LFOOT ← 0 ; FOOL ← IF PAL>COL THEN PINE ELSE LINE ;
02800 PFOOT ← IF FOOL=0 THEN 0 ELSE IF LDB(FOOTM(AA[PAL MAX COL,FOOL]))=31 THEN 30 ELSE 0;
02900 FOR C ← COL, PAL DO
03000 BEGIN
03100 L1 ← 1 ; L2 ← IF C = COL THEN LINE ELSE PINE ;
03200 TC ← IF C=COL THEN TOCOL ELSE (TOCOL+COLS-1) MOD (2*COLS) + 1 ;
03300 TL ← IF C=COL THEN TOLINE-1 ELSE RH(AA[TC,0]) ;
03400 F ← IF C LEQ COLS THEN LFOOT ELSE PFOOT ;
03500 FOR L ← L1 THRU L2 DO IF (X ← AA[C,L]) GEQ GRPOLX THEN
03600 BEGIN
03700 AA[TC, TL ← TL + 1] ← X ; AA[C, L] ← 0 ;
03800 IF LDB(FOOTM(X)) THEN DPB(F←IF F=31 THEN 1 ELSE F+1, FOOTM(X)) ;
03900 END ;
04000 IF C= COL THEN BEGIN LINE ← TL ; COL ← TC END ELSE BEGIN PINE ← TL ; PAL ← TC END ;
04100 END ;
04200 GRPOLX ← 0 ;
04300 END "SAME PAGE" ;
04400 DAPART ; RETURN(TRUE) ;
04500 END "MOVEGROUP" ;
00100 PUBLIC RECURSIVE PROCEDURE TOCOLUMN(INTEGER COLNO) ;$"#
00200 IF ON THEN
00300 BEGIN "TOCOLUMN"
00400 ASSUREAREA ;
00500 IF COLNO < COL OR (COLNO=COL AND LINE) OR TES 10/25/73; COLNO>COLS THEN NEXTPAGE ;
00600 IF 1 LEQ COLNO LEQ COLS THEN COL←COLNO ELSE
00700 BEGIN TES 10/25/73;
00800 WARN(NULL, "SKIP to nonexistent column "&CVS(COLNO));
00900 COLNO ← 1 ;
01000 END ;
01100 LINE ← 0 ; IF COL>1 THEN OPENAREA(AREAIXM) ;
01200 END "TOCOLUMN" ;
00100 FINISHED
00200
00300 ENDOF("COLMS")